/**
 * 将小于10的数值前面补0
 * @param {Number} num 需要处理的数字
 * @return {String} 已经处理完的字符串
 */
const addZero = num => {
  return num < 10 ? `0${num}` : `${num}`;
};

/**
 * 将秒数转化为年月日时分秒
 * @param {Number} seconds 需要转化的秒数
 * @return {String} 格式化后的年月日时分秒
 */
const formatDate = seconds => {
  const time = new Date(seconds);
  const y = time.getFullYear();
  const m = time.getMonth() + 1;
  const d = time.getDate();
  const hh = time.getHours();
  const mm = time.getMinutes();
  const ss = time.getSeconds();
  const timeSrt = `${y}-${addZero(m)}-${addZero(d)} ${addZero(hh)}:${addZero(mm)}:${addZero(ss)}`;
  return timeSrt;
};

/**
 * 将秒数转化为天时分
 * @param {Number} seconds 需要转化的秒数
 * @return {String} 格式化后的天时分
 */
const secondToDate = seconds => {
  if (seconds < 120) return '1 分钟'; // 小于120秒显示为1分钟
  let min = parseInt(seconds / 60);
  if (min < 60) return `${min} 分钟`; // 大于2分钟小于60分钟显示分钟
  let hours = parseInt(seconds / 3600);
  min = min % 60;
  if (hours < 24) return `${hours} 小时 ${min} 分钟`; // 大于60分钟小于24小时显示小时分钟
  const day = parseInt(seconds / 86400);
  hours = hours % 24;
  return `${day} 天 ${hours} 小时 ${min} 分钟`; // 大于24小时显示天小时分钟
};

/**
 * 根据不同属性数组去重复
 * @param {Array} list 需要去重复的数组
 * @param {String} attribute 去重复的属性
 * @return {Array} 已去重的新数组
 */
const listLostRepeat = (list, attribute) => {
  const hash = [];
  const newList = [];
  for (let n = 0; n < list.length; n++) {
    if (hash.indexOf(list[n][attribute]) === -1) {
      hash.push(list[n][attribute]);
      newList.push(list[n]);
    }
  }
  return newList;
};

/**
 * 批量保存拼接id
 * @param {Array} list 需要拼接id的数组
 * @return {String} 已拼接完的id串
 */
const concatIds = list => {
  let ids = '';
  list.map(item => {
    ids += item + ',';
  });
  ids = ids.slice(0, -1);
  return ids;
};

const sortRouter = name => {
  return (first, second) => {
    const firstValue = first[name];
    const secondValue = second[name];
    return firstValue - secondValue;
  };
};

/**
 * 给自定义表头添加icon
 * @param {Function} h render函数
 * @param {Object} column 表头列的标签内容
 * @return {Object} 完成自定义后的表头内容
 */
const createdTableHeader = (h, column) => {
  const labels = column.label.split('\n');
  const iconSpans = [];
  const noIconSpans = [];
  const iconStyle = {
    class: 'el-icon-question',
    style: 'color: #606266; line-height: 18px;',
  };
  const iconSpansStyle = {
    style: 'margin-right: 5px; float: left; font-weight: bold; display: block; line-height: 18px;',
  };
  const noIconStyle = {
    style: 'font-weight: bold; display: block; line-height: 18px;',
  };
  for (let i = 0; i < labels.length; i++) {
    iconSpans[i] = h('i', iconStyle, [h('span', iconSpansStyle, labels[i])]);
    noIconSpans[i] = h('span', noIconStyle, labels[i]);
  }
  return {
    iconSpans,
    noIconSpans,
  };
};

/**
 * 获取文件名后缀信息
 * @param {String} fileName 需要检测文件信息的名字
 * @return {String} 文件名后缀
 */
const getFileType = fileName => {
  const lastTypeIndex = fileName.lastIndexOf('.');
  const fileNameLength = fileName.length;
  const fileType = fileName.substring(lastTypeIndex, fileNameLength).toLowerCase();
  return fileType;
};

// 补零函数
const padLeft = (num, digits) => num.toString().padStart(digits, '0');

// 生成指定范围的随机数
const getRandom = (min, max) => Math.floor(Math.random() * (max - min + 1)) + min;

/**
 * 文件重命名
 * @param {String} filename 需要重命名的文件名
 * @param {Boolean} yearsPrefix 是否需要加上年月作为前缀路径
 * @return {String} 重命名后的文件名
 */
const calculateFileName = (filename, yearsPrefix = true) => {
  const getSuffix = filename => {
    const index = filename.lastIndexOf('.');
    let suffix = '';
    if (index !== -1) suffix = filename.substring(index);
    return suffix;
  };
  const randomString = () => {
    const DateObj = new Date();
    const timeList = [
      DateObj.getDate(),
      DateObj.getHours(),
      DateObj.getMinutes(),
      DateObj.getSeconds(),
    ];
    const millisecond = padLeft(DateObj.getMilliseconds(), 3);
    const padLeftTimeList = timeList.map(item => padLeft(item));
    const randomNum = getRandom(10000, 99999);
    padLeftTimeList.push(millisecond, randomNum);
    return padLeftTimeList.join('');
  };
  let res = randomString(10) + getSuffix(filename);
  // 判断是否需要加上年月的路径区分
  if (yearsPrefix) {
    const date = new Date();
    const year = date.getFullYear();
    const month = date.getMonth() + 1;
    res = `${year}/${month < 10 ? '0' + month : month}/${res}`;
  }
  return res;
};

/**
 * 将列表转换成transfer适用列表
 * @param {Array} list 需要转换的数组
 * @param {string} title 标题的字段名
 * @param {string} key 唯一标识字段名
 **/
const disposeTransferList = (list, title, key) => {
  return list.map(item => {
    item.title = item[title];
    item.key = item[key] && item[key].toString();
    return item;
  });
};

/**
 * 限制数字输入框只能输入整数
 **/
const limitNumber = value => {
  if (typeof value === 'string') {
    return !isNaN(Number(value)) ? value.replace(/^(0+)|[^\d]/g, '') : '';
  } else if (typeof value === 'number') {
    return !isNaN(value) ? String(value).replace(/^(0+)|[^\d]/g, '') : '';
  } else {
    return '';
  }
};

export {
  formatDate,
  secondToDate,
  listLostRepeat,
  concatIds,
  sortRouter,
  createdTableHeader,
  getFileType,
  calculateFileName,
  disposeTransferList,
  limitNumber,
};
